package com.vue.admin.service.common.mybatis.entity;

import com.vue.admin.service.common.constant.BaseConstant;
import org.apache.ibatis.session.RowBounds;

import java.util.ArrayList;
import java.util.List;

/**
 * @program: vue-admin-service
 * @description: 分页实体类
 * @author: zhangyangyang
 * @create: 2020-04-03 11:01
 *
 * 为什么继承 RowBounds ?
 *
 **/
public class Page<T> extends RowBounds {

    /**
     * 页编号 : 第几页
     */
    protected int pageNumber = 1;

    /**
     * 页大小 : 每页的数量
     */
    protected int pageSize = 10;

    /**
     * 偏移量 : 第一条数据在表中的位置
     */
    protected int offset;

    /**
     * 限定数 : 每页的数量
     */
    protected int limit;

    /**
     * 查询结果
     */
    protected List<T> rows = new ArrayList<T>();

    /**
     * 总条数
     */
    protected int total;

    /**
     * 总页数
     */
    protected int totalPages;

    public Page() {
        this.calcOffset();
        this.calcLimit();
    }

    public Page(int pageNumber, int pageSize) {
        this.pageNumber = pageNumber;
        this.pageSize = pageSize;
        this.calcOffset();
        this.calcLimit();
    }

    public Page(Query search) {
        if(search != null && search.get(BaseConstant.PAGE_NUMBER) != null) {
            this.pageNumber = search.getAsInt("pageNumber").intValue();
        }
        if(search != null && search.get(BaseConstant.PAGE_SIZE) != null) {
            this.pageSize = search.getAsInt("pageSize").intValue();
        }
        this.calcOffset();
        this.calcLimit();
    }

    /**
     * 计算限定数
     */
    private void calcLimit() {
        this.limit = this.pageSize;
    }

    /**
     * 计算偏移量
     */
    private void calcOffset() {
        this.offset = (this.pageNumber - 1) * this.pageSize;
    }

    /**
     * 根据pageNumber和pageSize计算当前页第一条记录在总结果集中的位置,序号从1开始.
     */
    public int getFirst() {
        return ((this.pageNumber - 1) * this.pageSize) + 1;
    }

    @Override
    public int getLimit() {
        return this.limit;
    }

    /**
     * 根据pageNumber和pageSize计算当前页第一条记录在总结果集中的位置,序号从0开始.
     */
    @Override
    public int getOffset() {
        return this.offset;
    }

    /**
     * 获得当前页的页号,序号从1开始,默认为1.
     */
    public int getPageNumber() {
        return this.pageNumber;
    }

    /**
     * 获得每页的记录数量,默认为1.
     */
    public int getPageSize() {
        return this.pageSize;
    }

    /**
     * 取得页内的记录列表.
     */
    public List<T> getRows() {
        return this.rows;
    }

    /**
     * 取得总记录数, 默认值为-1.
     */
    public int getTotal() {
        return this.total;
    }

    /**
     * 根据pageSize与total计算总页数, 默认值为-1.
     */
    public int getTotalPages() {
        if(this.total < 0) {
            return -1;
        }
        int pages = this.total / this.pageSize;
        return this.total % this.pageSize > 0 ? ++pages : pages;
    }

    /**
     * 设置页内的记录列表.
     */
    public void setRows(final List<T> rows) {
        this.rows = rows;
    }

    /**
     * 设置总记录数.
     */
    public void setTotal(final int total) {
        this.total = total;
        this.totalPages = this.getTotalPages();
    }

    public void setTotalPages(int totalPages) {
        this.totalPages = totalPages;
    }

    public void setPageNumber(int pageNumber) {
        this.pageNumber = pageNumber;
    }

    public void setPageSize(int pageSize) {
        this.pageSize = pageSize;
    }

    @Override
    public String toString() {
        return "Page{" +
                "pageNumber=" + pageNumber +
                ", pageSize=" + pageSize +
                ", offset=" + offset +
                ", limit=" + limit +
                ", rows=" + rows +
                ", total=" + total +
                ", totalPages=" + totalPages +
                '}';
    }
}
